#pragma once

#include <iostream>
#include <string>
#include <functional>
#include <memory>
#include "InetAddr.hpp"


class Reactor;
class Connection;



//普通fd , listensockfd
//想让我们对fd的处理方式,采用同一种方式
//描述一个连接


class Connection
{
public:
    Connection():_sockfd(-1),_events(0)
    {
        //自动获取当前系统的时间戳
    }
    //如果是一个listensocked,就注册获取新链接的方法
    //如果是普通的套接字,就注册读写方法
    void UpdateTime()
    {
        //重新获取时间
    }

    void SetPeerInfo(const InetAddr& peer_addr)
    {
        _peer_addr = peer_addr;
    }

    void SetSockfd(int sockfd)
    {
        _sockfd = sockfd;
    }
    void DisCardOutString(int n)
    {
        _outbuffer.erase(0,n);
    }

    int Sockfd()
    {
        return _sockfd;
    }

    void SetEvents(uint32_t events)
    {
        _events = events;
    }
    uint32_t GetEvents()
    {
        return _events;

    }
    //回调方法E
    virtual void Recver() = 0;
    virtual void Sender() = 0;
    virtual void Excepter() = 0;
    void Close()
    {
        if(_sockfd >= 0)
        {
            close(_sockfd);
        }
    }
    ~Connection()
    {

    }
    void AppendString(const std::string& in)
    {
        _inbuffer += in;
        //把接收到的数据添加到自己的接收缓存区
    }
    void AppendToOut(const std::string& out)
    {
        _outbuffer += out;
    }
    bool IsOutBufferEmpty()
    {
        return _outbuffer.empty();
    }
    std::string& OutString()
    {
        return _outbuffer;
    }
    std::string& InString()
    {
        return _inbuffer;
    }
    void SetOwner(Reactor* owner)
    {
        _owner = owner;
    }
    Reactor* GetOwner()
    {
        return _owner;
    }
protected:
    int _sockfd;
    std::string _inbuffer;
    std::string _outbuffer;

    InetAddr _peer_addr; //对应哪一个客户端

    //添加一个connect指针
    Reactor* _owner;

    uint32_t _events;//connection关心的事件
    
    //lastmodtime
    uint64_t _timestamp;
};



// class Factory
// {
// public:
//     static std::shared_ptr<Connection> BuildConnection(int fd,uint32_t events,func_t r,func_t w,func_t e)
//     {
//         std::shared_ptr<Connection> conn = std::make_shared<Connection>(fd);
//         conn->SetEvents(events);
//         conn->InitCB(r,w,e);
//         return conn;
//     }
// };






//可以封装成基类
// class ListenConnection : public Connection
// {

// };

// class NormalConnection : public Connection
// {

// };